# 拦截器:通过拦截所有的请求进行登录验证的过程
from application import app
from flask import request,redirect,g,jsonify
from common.models.member.Member import Member
from common.libs.member.MemberService import MemberService
import re
# static页面是不需要登录的

'''
api认证:只认证api请求
'''


# 通过注解去判断  注解会自己解析下面的代码
@app.before_request
def before_request():
    api_ignore_urls = app.config['API_IGNORE_URLS']
    path = request.path
    if "/api" not in path:
        return

    member_info=check_member_login()
    # app.logger.info(user_info)
    # flask中的g变量的使用  去获取当前登录状态
    g.member_info = None
    if member_info:
        g.member_info = member_info

    pattern = re.compile('%s' % "|".join(api_ignore_urls))
    if pattern.match(path):
        return

    if not member_info:
        # 重定向
        resp = {'code': -1, 'msg': '未登录', 'data': {}}
        return jsonify(resp)
    return

'''
判断用户是否已经登录：吧cookie值取出来 然后进行逆向运算 :将我们cookie中存的信息和我们算出来的信息进行对比
'''
def check_member_login():
    auth_cookie = request.headers.get("Authorization")

    # app.logger.info(auth_cookie)
    #cookie的验证过程： 从cookie中取出uid，
    # 从uid到数据库中查出他的个人信息 再通过个人信息生成一个授权码 再将授权码进行对比
    if auth_cookie is None:
        return False

    # 授权码 和uid   uid去数据库看这个用户信息是否存在  如果信息一致则登录，否则全部篡改
    # 分割
    auth_info = auth_cookie.split("#")
    if len(auth_info) !=2:
        return False
    try:
        member_info =Member.query.filter_by( id=auth_info[1]).first()
    except Exception:
        return False

    if member_info is None:
        return False

    if auth_info[0] !=MemberService.geneAuthCode(member_info):
        return False

    if member_info.status !=1:
        return False
    return member_info